package com.ycy.lucene.sort;

import com.ycy.lucene.index.IndexReadDemo;
import org.apache.lucene.document.NumericDocValuesField;
import org.apache.lucene.search.*;

public class QueryBySortDemo {

  /**
   * 1 使用Sort 排序 lucene就不会打分
   *
   * @param args
   */
  public static void main(String[] args) {

//    searchBySort2();
//
//    searchBySort3();

    searchBySort4();

  }


  /**
   * id自然排序升序
   * 其他域的自然排序是降序
   */
  private static void searchBySort2() {
    try {
      Query query = NumericDocValuesField.newSlowRangeQuery("has", 0L, 1);
      //id 自然顺序是升序,其他字段自然顺序是降序 包括score
      IndexReadDemo.search(query, 10, Sort.INDEXORDER); //升序
      IndexReadDemo.search(query, 10, null); //降序
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * SortedNumericSortField
   */
  private static void searchBySort3() {
    try {
      Query query = NumericDocValuesField.newSlowRangeQuery("has", 0L, 1);
      //排序是指定那个指定排序
      IndexReadDemo.search(query, 10, new Sort(new SortedNumericSortField("sales", SortField.Type.INT, true)));
      IndexReadDemo.search(query, 10, new Sort(new SortField("id", SortField.Type.STRING_VAL, true))); //按照id排序, 降序


    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 多值域排序
   * SortedSetSortField
   */
  private static void searchBySort4() {
    try {
      Query query = NumericDocValuesField.newSlowRangeQuery("has", 0L, 1);
      //注意:自然排序是降序
      // 阈值为null,代表最小
      //多值域排序,SortedSetSelector.Type.MIN取域值中最小的那个参与排序 和 相反的还有SortedSetSelector.Type.MAX

      //不知道为啥下面的东西不生效了????
      IndexReadDemo.search(query, 10, new Sort(new SortedSetSortField("sortByString", false, SortedSetSelector.Type.MIN)));
//      IndexReadDemo.search(query, 10, new Sort(new SortedSetSortField("sortByString", true, SortedSetSelector.Type.MIN)));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}
